import {
  buildLinuxPodmanCommand,
  buildLinuxStandaloneCommand,
  buildLinuxSwarmCommand,
  buildLinuxKubernetesCommand,
  buildWindowsStandaloneCommand,
  buildWindowsSwarmCommand,
} from './scripts';
import { ScriptFormValues } from './types';

describe.each([
  {
    name: 'buildLinuxStandaloneCommand',
    builder: buildLinuxStandaloneCommand,
    defaultProperties: {
      allowSelfSignedCertificates: false,
      authEnabled: false,
      edgeGroupsIds: [],
      edgeIdGenerator: '',
      envVars: '',
      group: 0,
      os: 'linux' as const,
      platform: 'standalone' as const,
      tagsIds: [],
      tlsEnabled: false,
    },
    edgeIdGeneratorValue: 'uuidgen',
  },
  {
    name: 'buildLinuxPodmanCommand',
    builder: buildLinuxPodmanCommand,
    defaultProperties: {
      allowSelfSignedCertificates: false,
      authEnabled: false,
      edgeGroupsIds: [],
      edgeIdGenerator: '',
      envVars: '',
      group: 0,
      os: 'linux' as const,
      platform: 'podman' as const,
      tagsIds: [],
      tlsEnabled: false,
    },
    edgeIdGeneratorValue: 'uuidgen',
  },
  {
    name: 'buildLinuxSwarmCommand',
    builder: buildLinuxSwarmCommand,
    defaultProperties: {
      allowSelfSignedCertificates: false,
      authEnabled: false,
      edgeGroupsIds: [],
      edgeIdGenerator: '',
      envVars: '',
      group: 0,
      os: 'linux' as const,
      platform: 'swarm' as const,
      tagsIds: [],
      tlsEnabled: false,
    },
    edgeIdGeneratorValue: 'uuidgen',
  },
  {
    name: 'buildLinuxKubernetesCommand',
    builder: buildLinuxKubernetesCommand,
    defaultProperties: {
      allowSelfSignedCertificates: false,
      authEnabled: false,
      edgeGroupsIds: [],
      edgeIdGenerator: '',
      envVars: '',
      group: 0,
      os: 'linux' as const,
      platform: 'k8s' as const,
      tagsIds: [],
      tlsEnabled: false,
    },
    edgeIdGeneratorValue: 'uuidgen',
  },
  {
    name: 'buildWindowsStandaloneCommand',
    builder: buildWindowsStandaloneCommand,
    defaultProperties: {
      allowSelfSignedCertificates: false,
      authEnabled: false,
      edgeGroupsIds: [],
      edgeIdGenerator: '',
      envVars: '',
      group: 0,
      os: 'win' as const,
      platform: 'standalone' as const,
      tagsIds: [],
      tlsEnabled: false,
    },
    edgeIdGeneratorValue: 'Get-MachineGUID',
  },
  {
    name: 'buildWindowsSwarmCommand',
    builder: buildWindowsSwarmCommand,
    defaultProperties: {
      allowSelfSignedCertificates: false,
      authEnabled: false,
      edgeGroupsIds: [],
      edgeIdGenerator: '',
      envVars: '',
      group: 0,
      os: 'win' as const,
      platform: 'swarm' as const,
      tagsIds: [],
      tlsEnabled: false,
    },
    edgeIdGeneratorValue: 'Get-MachineGUID',
  },
])('$name', ({ builder, defaultProperties, edgeIdGeneratorValue }) => {
  it('should generate basic command with minimal configuration', () => {
    const command = builder(
      '2.19.0',
      'test-edge-key',
      defaultProperties,
      false,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with async mode enabled', () => {
    const command = builder(
      '2.19.0',
      'test-edge-key',
      defaultProperties,
      true,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with self-signed certificates allowed', () => {
    const properties: ScriptFormValues = {
      ...defaultProperties,
      allowSelfSignedCertificates: true,
    };

    const command = builder(
      '2.19.0',
      'test-edge-key',
      properties,
      false,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with edge ID generator', () => {
    const properties: ScriptFormValues = {
      ...defaultProperties,
      edgeIdGenerator: edgeIdGeneratorValue,
    };

    const command = builder(
      '2.19.0',
      'test-edge-key',
      properties,
      false,
      undefined,
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with custom environment variables', () => {
    const properties: ScriptFormValues = {
      ...defaultProperties,
      envVars: 'MY_VAR=value1,ANOTHER_VAR=value2',
    };

    const command = builder(
      '2.19.0',
      'test-edge-key',
      properties,
      false,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with edge groups', () => {
    const properties: ScriptFormValues = {
      ...defaultProperties,
      edgeGroupsIds: [1, 2, 3],
    };

    const command = builder(
      '2.19.0',
      'test-edge-key',
      properties,
      false,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with portainer group', () => {
    const properties: ScriptFormValues = {
      ...defaultProperties,
      group: 5,
    };

    const command = builder(
      '2.19.0',
      'test-edge-key',
      properties,
      false,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with tags', () => {
    const properties: ScriptFormValues = {
      ...defaultProperties,
      tagsIds: [10, 20, 30],
    };

    const command = builder(
      '2.19.0',
      'test-edge-key',
      properties,
      false,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with all meta variables', () => {
    const properties: ScriptFormValues = {
      ...defaultProperties,
      edgeGroupsIds: [1, 2],
      group: 5,
      tagsIds: [10, 20],
    };

    const command = builder(
      '2.19.0',
      'test-edge-key',
      properties,
      false,
      'test-edge-id',
      'test-secret'
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command without agent secret', () => {
    const command = builder(
      '2.19.0',
      'test-edge-key',
      defaultProperties,
      false,
      'test-edge-id',
      undefined
    );

    expect(command).toMatchSnapshot();
  });

  it('should generate command with empty agent secret', () => {
    const command = builder(
      '2.19.0',
      'test-edge-key',
      defaultProperties,
      false,
      'test-edge-id',
      ''
    );

    expect(command).toMatchSnapshot();
  });
});
